package com.zhouzi.zhaoyang.util;

import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;
import java.util.Random;

/**
 * @author Jasmine
 * @date 2019/12/5.
 * @description
 */
public class DateUtil {
        /** 日志对象 */

        /** 年-月-日 时:分:秒 显示格式 */
        // 备注:如果使用大写HH标识使用24小时显示格式,如果使用小写hh就表示使用12小时制格式。
        public static String DATE_TO_STRING_DETAIAL_PATTERN = "yyyy-MM-dd HH:mm:ss";

        /** 年-月-日 显示格式 */
        public static String DATE_TO_STRING_SHORT_PATTERN = "yyyy-MM-dd";

        private static SimpleDateFormat simpleDateFormat;

        /**
         * Date类型转为指定格式的String类型
         *
         * @param source
         * @param pattern
         * @return
         */
        public static String DateToString(Date source, String pattern) {
            simpleDateFormat = new SimpleDateFormat(pattern);
            return simpleDateFormat.format(source);
        }


        /**
         * 获取现在时间
         *
         * @return 返回时间类型 yyyy-MM-dd HH:mm:ss
         */
        public static Date getNowDate() {
            Date currentTime = new Date();
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String dateString = formatter.format(currentTime);
            ParsePosition pos = new ParsePosition(8);
            Date currentTime_2 = formatter.parse(dateString, pos);
            return currentTime_2;
        }

        /**
         * 获取现在时间
         *
         * @return返回短时间格式 yyyy-MM-dd
         */
        public static Date getNowDateShort() {
            Date currentTime = new Date();
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
            String dateString = formatter.format(currentTime);
            ParsePosition pos = new ParsePosition(8);
            Date currentTime_2 = formatter.parse(dateString, pos);
            return currentTime_2;
        }

        /**
         * 获取现在时间
         *
         * @return返回字符串格式 yyyy-MM-dd HH:mm:ss
         */
        public static String getStringDate() {
            Date currentTime = new Date();
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String dateString = formatter.format(currentTime);
            return dateString;
        }

        /**
         * 获取现在时间
         *
         * @return 返回短时间字符串格式yyyy-MM-dd
         */
        public static String getStringDateShort() {
            Date currentTime = new Date();
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
            String dateString = formatter.format(currentTime);
            return dateString;
        }

        /**
         * 获取时间 小时:分;秒 HH:mm:ss
         *
         * @return
         */
        public static String getTimeShort() {
            SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss");
            Date currentTime = new Date();
            String dateString = formatter.format(currentTime);
            return dateString;
        }

        /**
         * 将长时间格式字符串转换为时间 yyyy-MM-dd HH:mm:ss
         *
         * @param strDate
         * @return
         */
        public static Date strToDateLong(String strDate) {
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            ParsePosition pos = new ParsePosition(0);
            Date strtodate = formatter.parse(strDate, pos);
            return strtodate;
        }

        /**  * 将长时间格式时间转换为字符串 yyyy-MM-dd HH:mm:ss  *   * @param dateDate  * @return  */
        public static String dateToStrLong(java.util.Date dateDate) {
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String dateString = formatter.format(dateDate);
            return dateString;
        }

        /**
         * 将短时间格式时间转换为字符串 yyyy-MM-dd
         *
         * @param dateDate
         * @param k
         * @return
         */
        public static String dateToStr(java.util.Date dateDate) {
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
            String dateString = formatter.format(dateDate);
            return dateString;
        }

        /**
         * 将短时间格式字符串转换为时间 yyyy-MM-dd
         *
         * @param strDate
         * @return
         */
        public static Date strToDate(String strDate) {
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
            ParsePosition pos = new ParsePosition(0);
            Date strtodate = formatter.parse(strDate, pos);
            return strtodate;
        }

        /**
         * 得到现在时间
         *
         * @return
         */
        public static Date getNow() {
            Date currentTime = new Date();
            return currentTime;
        }

        /**
         * 提取一个月中的最后一天
         *
         * @param day
         * @return
         */
        public static Date getLastDate(long day) {
            Date date = new Date();
            long date_3_hm = date.getTime() - 3600000 * 34 * day;
            Date date_3_hm_date = new Date(date_3_hm);
            return date_3_hm_date;
        }

        /**
         * 得到现在时间
         *
         * @return 字符串 yyyyMMdd HHmmss
         */
        public static String getStringToday() {
            Date currentTime = new Date();
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String dateString = formatter.format(currentTime);
            return dateString;
        }

        /**
         * 得到现在小时
         */
        public static String getHour() {
            Date currentTime = new Date();
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String dateString = formatter.format(currentTime);
            String hour;
            hour = dateString.substring(11, 13);
            return hour;
        }

        /**
         * 得到现在分钟
         *
         * @return
         */
        public static String getTime() {
            Date currentTime = new Date();
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String dateString = formatter.format(currentTime);
            String min;
            min = dateString.substring(14, 16);
            return min;
        }

        /**
         * 根据用户传入的时间表示格式，返回当前时间的格式 如果是yyyyMMdd，注意字母y不能大写。
         *
         * @param sformat
         *            yyyyMMddhhmmss
         * @return
         */
        public static String getUserDate(String sformat) {
            Date currentTime = new Date();
            SimpleDateFormat formatter = new SimpleDateFormat(sformat);
            String dateString = formatter.format(currentTime);
            return dateString;
        }

        /**
         * 二个小时时间间的差值,必须保证二个时间都是"HH:MM"的格式，返回字符型的分钟
         */
        public static String getTwoHour(String st1, String st2) {
            String[] kk = null;
            String[] jj = null;
            kk = st1.split(":");
            jj = st2.split(":");
            if (Integer.parseInt(kk[0]) < Integer.parseInt(jj[0]))
                return "0";
            else {
                double y = Double.parseDouble(kk[0]) + Double.parseDouble(kk[1]) / 60;
                double u = Double.parseDouble(jj[0]) + Double.parseDouble(jj[1]) / 60;
                if ((y - u) > 0)
                    return y - u + "";
                else
                    return "0";
            }
        }

        /**
         * 得到二个日期间的间隔天数
         */
        public static String getTwoDay(String sj1, String sj2) {
            SimpleDateFormat myFormatter = new SimpleDateFormat("yyyy-MM-dd");
            long day = 0;
            try {
                java.util.Date date = myFormatter.parse(sj1);
                java.util.Date mydate = myFormatter.parse(sj2);
                day = (date.getTime() - mydate.getTime()) / (24 * 60 * 60 * 1000);
            } catch (Exception e) {
                return "";
            }
            return day + "";
        }

        /**
         * 时间前推或后推分钟,其中JJ表示分钟.
         */
        public static String getPreTime(String sj1, String jj) {
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String mydate1 = "";
            try {
                Date date1 = format.parse(sj1);
                long Time = (date1.getTime() / 1000) + Integer.parseInt(jj) * 60;
                date1.setTime(Time * 1000);
                mydate1 = format.format(date1);
            } catch (Exception e) {
            }
            return mydate1;
        }

        /**
         * 得到一个时间延后或前移几天的时间,nowdate为时间,delay为前移或后延的天数
         */
        public static String getNextDay(String nowdate, String delay) {
            try{
                SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
                String mdate = "";
                Date d = strToDate(nowdate);
                long myTime = (d.getTime() / 1000) + Integer.parseInt(delay) * 24 * 60 * 60;
                d.setTime(myTime * 1000);
                mdate = format.format(d);
                return mdate;
            }catch(Exception e){
                return "";
            }
        }

        /**
         * 判断是否润年
         *
         * @param ddate
         * @return
         */
        public static boolean isLeapYear(String ddate) {

            /**
             * 详细设计： 1.被400整除是闰年，否则： 2.不能被4整除则不是闰年 3.能被4整除同时不能被100整除则是闰年
             * 3.能被4整除同时能被100整除则不是闰年
             */
            Date d = strToDate(ddate);
            GregorianCalendar gc = (GregorianCalendar) Calendar.getInstance();
            gc.setTime(d);
            int year = gc.get(Calendar.YEAR);
            if ((year % 400) == 0)
                return true;
            else if ((year % 4) == 0) {
                if ((year % 100) == 0)
                    return false;
                else
                    return true;
            } else
                return false;
        }

        /**
         * 返回美国时间格式 26 Apr 2006
         *
         * @param str
         * @return
         */
        public static String getEDate(String str) {
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
            ParsePosition pos = new ParsePosition(0);
            Date strtodate = formatter.parse(str, pos);
            String j = strtodate.toString();
            String[] k = j.split(" ");
            return k[2] + k[1].toUpperCase() + k[5].substring(2, 4);
        }

        /**
         * 获取一个月的最后一天
         *
         * @param dat
         * @return
         */
        public static String getEndDateOfMonth(String dat) {// yyyy-MM-dd
            String str = dat.substring(0, 8);
            String month = dat.substring(5, 7);
            int mon = Integer.parseInt(month);
            if (mon == 1 || mon == 3 || mon == 5 || mon == 7 || mon == 8 || mon == 10 || mon == 12) {
                str += "31";
            } else if (mon == 4 || mon == 6 || mon == 9 || mon == 11) {
                str += "30";
            } else {
                if (isLeapYear(dat)) {
                    str += "29";
                } else {
                    str += "28";
                }
            }
            return str;
        }


        /**
         * 产生周序列,即得到当前时间所在的年度是第几周
         *
         * @return
         */
        public static String getSeqWeek() {
            Calendar c = Calendar.getInstance(Locale.CHINA);
            String week = Integer.toString(c.get(Calendar.WEEK_OF_YEAR));
            if (week.length() == 1)
                week = "0" + week;
            String year = Integer.toString(c.get(Calendar.YEAR));
            return year + week;
        }


        /**
         * 两个时间之间的天数
         *
         * @param date1
         * @param date2
         * @return
         */
        public static long getDays(String date1, String date2) {
            if (date1 == null || date1.equals(""))
                return 0;
            if (date2 == null || date2.equals(""))
                return 0;
            // 转换为标准时间
            SimpleDateFormat myFormatter = new SimpleDateFormat("yyyy-MM-dd");
            java.util.Date date = null;
            java.util.Date mydate = null;
            try {
                date = myFormatter.parse(date1);
                mydate = myFormatter.parse(date2);
            } catch (Exception e) {
            }
            long day = (date.getTime() - mydate.getTime()) / (24 * 60 * 60 * 1000);
            return day;
        }

        /**
         * 取得数据库主键 生成格式为yyyymmddhhmmss+k位随机数
         *
         * @param k
         *            表示是取几位随机数，可以自己定
         */

        public static String getNo(int k) {

            return getUserDate("yyyyMMddhhmmss") + getRandom(k);
        }

        /**
         * 返回一个随机数
         *
         * @param i
         * @return
         */
        public static String getRandom(int i) {
            Random jjj = new Random();
            // int suiJiShu = jjj.nextInt(9);
            if (i == 0)
                return "";
            String jj = "";
            for (int k = 0; k < i; k++) {
                jj = jj + jjj.nextInt(9);
            }
            return jj;
        }


    }
